জাভাস্ক্রিপ্ট ফাংশন function কি-ওয়ার্ড দ্বারা ডিফাইন করা হয়।
আপনি ফাংশন ডিক্লেয়ারেশন অথবা ফাংশন এক্সপ্রেশন ব্যবহার করতে পারেন।
ফাংশন ডিক্লেয়ারেশনের গঠনপ্রণালীঃ
kt_satt_skill_example_id=1171
ফাংশনকে ডিক্লেয়ার করলেই ইহা এক্সিকিউট হয় না, ফাংশনকে কল করলে ইহা এক্সিকিউট হয়ঃ
kt_satt_skill_example_id=1173
জাভাস্ক্রিপ্টের সম্পাদনযোগ্য স্টেটমেন্টগুলোকে আলাদা করার জন্য সেমিকোলন(;) ব্যবহার করা হয়।
ফাংশন যেহেতু সম্পাদনযোগ্য স্টেটমেন্ট নয় তাই এর শেষে সেমিকোলন ব্যবহার করতে হয় না।
জাভাস্ক্রিপ্ট ফাংশনকে এক্সপ্রেশনের মাধ্যমেও ডিফাইন করা যায়।
ফাংশন এক্সপ্রেশনকে একটি ভ্যারিয়েবলের মধ্যে রাখা হয় এবং পরবর্তীতে ভ্যারিয়েবলকে ফাংশন হিসেবে ব্যবহার করা হয়ঃ
kt_satt_skill_example_id=1175
kt_satt_skill_example_id=1177
উপরের ফাংশনটি anonymous(নামহীন) ফাংশন।
যেসকল ফাংশনকে ভ্যারিয়েবলে রাখা হয়, তাদের নামের প্রয়োজন হয়না। তাদেরকে সবসময় ভ্যারিয়েবলের নাম দ্বারা কল করা হয়।
উপরের ফাংশনটি সেমিকোলন দ্বারা শেষ হয়েছে। কারন ইহা সম্পাদনযোগ্য স্টেটমেন্ট।
এই টিউটোরিয়ালের শুরুতে আপনি হয়েস্টিং(Hoisting) সম্পর্কে জানতে পেরেছেন।
একটি স্কোপের ডিক্লেয়ারেশনকে সবার উপরে নিয়ে যাওয়াই হয়েস্টিং। এটি জাভাস্ক্রিপ্টের ডিফল্ট বৈশিষ্ট্য।
হয়েস্টিং শুধুমাত্র ভ্যারিয়েবল ও ফাংশন ডিক্লেয়ারেশনের ক্ষেত্রে প্রযোজ্য। এই কারনে,ফাংশন ডিক্লেয়ারেশনের পূর্বেই ফাংশনকে কল করা যায়ঃ
kt_satt_skill_example_id=1178
ফাংশন এক্সপ্রেশন হয়েস্টিং-এর অধীনে পড়ে না।
ফাংশন এক্সপ্রেশনকে সেলফ ইনভোকিং ফাংশন করা যায়। ফাংশন ডিক্লেয়ারকে সেলফ ইনভোকিং ফাংশন করা যায় না।
সেলফ ইনভোকিং এক্সপ্রেশন কল করা ছাড়াই স্বয়ংক্রিয়ভাবে কাজ করে।
সেলফ ইনভোকিং ফাংশনের গঠনপ্রণালীঃ
kt_satt_skill_example_id=1179
kt_satt_skill_example_id=1181
জাভাস্ক্রিপ্টের ভাষায় একে self-invoking anonymous function বলা হয়।
জাভাস্ক্রিপ্ট ফাংশন ভ্যালু হিসেবেও ব্যবহার হতে পারেঃ
kt_satt_skill_example_id=1183
জাভাস্ক্রিপ্ট ফাংশন এক্সপ্রেশন হিসেবেও ব্যবহার হতে পারেঃ
kt_satt_skill_example_id=1185
জাভাস্ক্রিপ্টের typeof অপারেটর "function" কে ফাংশন হিসেবে রিটার্ন করে।
কিন্তু অবজেক্ট হিসেবে ফাংশনকে ভালোভাবে বর্ণনা করা যায়।
জাভাস্ক্রিপ্ট ফাংশনের প্রোপার্টি এবং মেথড উভয়ই রয়েছে।
ফাংশনকে কল করা হলে কতটি আর্গুমেন্ট থাকে arguments.length প্রোপার্টি ফাংশনের আর্গুমেন্টের সংখ্যা রিটার্ন করেঃ
kt_satt_skill_example_id=1188
toString() মেথডটি ফাংশনকে স্ট্রিং হিসেবে রিটার্ন করেঃ
kt_satt_skill_example_id=1191
ফাংশনকে অবজেক্টের প্রোপার্টি হিসেবে ডিফাইন করলে তাকে অবজেক্টের মেথড বলা হয়।
নতুন অবজেক্ট তৈরি করার জন্য ব্যবহার করা হলে ফাংশনকে অবজেক্ট কনস্ট্রাক্টর বলা হয়।
জাভাস্ক্রিপ্ট ফাংশন তার প্যারামিটারের ভ্যালু(আর্গুমেন্ট) যাচাই করে না।
এই টিউটোরিয়ালের পূর্বে আপনি ফাংশনের প্যারামিটার সম্পর্কে জানতে পেরেছেন।
kt_satt_skill_example_id=1194
ফাংশন ডেফিনেশনে প্রথম বন্ধনীর মধ্যে লেখা নামগুলো হলো ফাংশন প্যারামিটার।
ফাংশনকে কল করলে প্রথম বন্ধনীর মধ্যে প্যারামিটারের জায়গাতে যে ভ্যালু দেওয়া হয় তাকেই ফাংশন আর্গুমেন্ট বলা হয়।
জাভাস্ক্রিপ্ট ফাংশনে প্যারামিটারের ডাটা টাইপ নির্দেশ করতে হয় না।
জাভাস্ক্রিপ্ট ফাংশন আর্গুমেন্টের টাইপ চেক করে না।
জাভাস্ক্রিপ্ট ফাংশন কয়টি আর্গুমেন্ট গ্রহন করা হয়েছে তা পরীক্ষা করে না।
যদি ফাংশনকে প্যারামিটারের ভ্যালু(আর্গুমেন্ট) দেওয়া ছাড়া কল করা হয়, তাহলে এর ভ্যালু undefined সেট হবে।
মাঝে মধ্যে এটি গ্রহনযোগ্য, কিন্তু প্যারামিটারের একটি ডিফল্ট ভ্যালু সেট করে দেওয়া ভালোঃ
kt_satt_skill_example_id=1195
যদি একটি ফাংশনকে নির্ধারিত আর্গুমেন্টের চেয়ে বেশি আর্গুমেন্ট দ্বারা কল করা হয় তবে অতিরিক্ত আর্গুমেন্টকে আর্গুমেন্ট অবজেক্ট দ্বারা এক্সেস করা যাবে।
আর্গুমেন্ট অবজেক্ট হলো জাভাস্ক্রিপ্ট ফাংশনের একটি বিল্ট-ইন অবজেক্ট।
আর্গুমেন্ট অবজেক্ট ফাংশনকে কল করার সময় যে আর্গুমেন্ট দেওয়া হয় তার একটি অ্যারে তৈরি করে।
এই পদ্ধতিতে আপনি খুব সহজেই একটি ফাংশন দ্বারা একটি সংখ্যার লিস্ট থেকে সর্বোচ্চ ভ্যালু বের করতে পারবেনঃ
kt_satt_skill_example_id=1196
অথবা সকল ভ্যালু যোগ করার জন্য একটি ফাংশন তৈরি করতে পারেনঃ
kt_satt_skill_example_id=1197
জাভাস্ক্রিপ্ট ফাংশনকে ৪ ভাবে কল(invoke) করা যায়।
প্রত্যেকটি মেথড this এর ইনিশিয়ালাইজেশনের ভিন্নতার কারণে পৃথক।
জাভাস্ক্রিপ্টে this কি-ওয়ার্ডটি ঐ অবজেক্টকে বুঝাবে, যে অবজেক্টের কোডের মধ্যে ইহা থাকবে।
যদি আমি একটি ফাংশনের মধ্যে this ব্যবহার করি, তাহলে ফাংশনটি যে অবজেক্টের মধ্যে রয়েছে this কি-ওয়ার্ডটি ঐ অবজেক্টকে বুঝায়।
আমরা জানি যে,জাভাস্ক্রিপ্ট ফাংশনকে এক্সিকিউট করার জন্য একে ইনভোক/কল করতে হয়।
kt_satt_skill_example_id=1201
উপরের ফাংশনটি কোনো অবজেক্টের অধীনে নয়। কিন্তু জাভাস্ক্রিপ্টে সবসময় একটি ডিফল্ট গ্লোবাল অবজেক্ট থাকে।
এইচটিএমএল-এ এইচটিএমল পেজ হলো ডিফল্ট গ্লোবাল অবজেক্ট, উপরের ফাংশনটি এইচটিএমল পেজের অধীনে রয়েছে।
ব্রাউজারে ব্রাউজার উইন্ডো হলো পেজের অবজেক্ট। এক্ষেত্রে ফাংশনটি স্বয়ংক্রিয়ভাবে উইন্ডোর ফাংশনে রূপান্তরিত হয়।
myFunction() এবং window.myFunction() একইঃ
kt_satt_skill_example_id=1203
ইহা জাভাস্ক্রিপ্ট ফাংশনকে কল করার একটি সাধারণ পন্থা, কিন্তু আমরা এমনটা অনুশীলন করবো না।
গ্লোবাল ভ্যারিয়েবল, মেথড অথবা ফাংশন ব্যবহার থেকে আমরা বিরত থাকবো।
ফাংশন কল করার সময় ইহা কোন অবজেক্টের অধীনস্থ উল্লেখ না থাকলে this এর ভ্যালু গ্লোবাল অবজেক্ট হয়ে যায়।
ওয়েব ব্রাউজারে গ্লোবাল অবজেক্ট হলো ব্রাউজার উইন্ডো।
kt_satt_skill_example_id=1204
জাভাস্ক্রিপ্টে আপনি ফাংশনকে অবজেক্টের মেথড হিসেবে ডিফাইন করতে পারেনঃ
kt_satt_skill_example_id=1205
fullName মেথডটি myObject অবজেক্টের মধ্যে বিদ্যমান একটি ফাংশন।
এখানে this দ্বারা myObject কে বুঝানো হয়েছে।
অবজেক্ট মেথড এর thisমানটি ,অবজেক্ট এর মালিক।
[object Object]
অবজেক্ট মেথড হিসেবে একটি ফাংশনকে কল করার কারণে this এর ভ্যালু এখানে অবজেক্ট দেখায়।
যদি new কি-ওয়ার্ড দ্বারা ফাংশনকে কল করা হয় তাহলে একে কনস্ট্রাক্টর ইনভোক করা বুঝায়।
kt_satt_skill_example_id=1207
একটি কনস্ট্রাক্টরকে ইনভোক করলে সেটি নতুন অবজেক্ট তৈরি করে। নতুন অবজেক্টটি তার কনস্ট্রাক্টর থেকে প্রোপার্টি ও মেথড ইনহেরিট করে।
কনস্ট্রাক্টরের this কি-ওয়ার্ডের কোনো ভ্যালু নেই।
যখন কনস্ট্রাক্টরকে ইনভোক করা হয় নতুন অবজেক্টটি this-এর ভ্যালু হবে।
জাভাস্ক্রিপ্টে ফাংশন হলো অবজেক্ট। জাভাস্ক্রিপ্ট ফাংশনের প্রোপার্টি ও মেথড থাকে।
call() এবং apply() জাভাস্ক্রিপ্ট ফাংশনের দুইটি প্রিডিফাইনড মেথড। মেথড দুইটিই ফাংশন ইনভোক করার জন্য ব্যবহার করা যায় এবং উভয় মেথডেরই প্রথম প্যারামিটার হিসেবে একটি অবজেক্ট থাকে।
kt_satt_skill_example_id=1208
kt_satt_skill_example_id=1209
উভয়ই মেথডই প্রথম আর্গুমেন্ট হিসেবে একটি অবজেক্ট গ্রহন করে। পার্থক্য শুধুমাত্র call() ফাংশন আর্গুমেন্টগুলো আলাদাভাবে গ্রহন করে এবং apply() ফাংশনের আর্গুমেন্টগুলো অ্যারে আকারে আকারে করে।
জাভাস্ক্রিপ্ট স্ট্রিক্ট মুডে(use strict) ফাংশন ইনভোকের সময় প্রথম আর্গুমেন্টটি this এর ভ্যালু হয়ে যায়, যদিও আর্গুমেন্টটি অবজেক্ট নয়। স্ট্রিক মুডে প্রথম আর্গুমেন্ট না দেওয়া হলে এঁরর দেখাবে। নন-স্ট্রিক্ট মুডে গ্লোবাল অবজেক্ট রুপান্তরিত হবে।
জাভাস্ক্রিপ্ট ভ্যারিয়েবলগুলো লোকাল বা গ্লোবাল স্কোপে থাকতে পারে।
ভ্যারিয়েবলকে ক্লোজারের মাধ্যমে প্রাইভেট ভ্যারিয়েবল করা যায়।
ফাংশনের ভিতরে ডিফাইন করা সকল ভ্যারিয়েবলকে একটি ফাংশন এক্সেস করতে পারে। নিচের উদাহরণে ভ্যারিয়েবল a হচ্ছে লোকাল ভ্যারিয়েবল। লোকাল ভ্যারিয়েবল শুধুমাত্র ফাংশনের ভিতর থেকে এক্সেস করা যায়, ফাংশনের বাহিরের কোথাও একে এক্সেস করা যাবে না।
kt_satt_skill_example_id=1212
ফাংশনের বাহিরে ডিফাইন করা ভ্যারিয়েবলকেও এক্সেস করতে পারে। নিচের উদাহরণে ভ্যারিয়েবল a হচ্ছে গ্লোবাল ভ্যারিয়েবল। গ্লোবাল ভ্যারিয়েবল ওয়েব পেজে উইন্ডো অবজেক্টের অধীনস্থ। গ্লোবাল ভ্যারিয়েবলকে সকল স্ক্রিপ্ট ব্যবহার এবং পরিবর্তন করতে পারে।
kt_satt_skill_example_id=1214
একই নামের গ্লোবাল ও লোকাল ভ্যারিয়েবল পরস্পর থেকে ভিন্ন। একটি পরিবর্তন করলেও অন্যটি অপরিবর্তিত থাকে।
var কি-ওয়ার্ড ছাড়া তৈরিকৃত সকল ভ্যারিয়েবল গ্লোবাল ভ্যারিয়েবলে পরিণত হয়।
ধরুণ আপনি কোনোকিছু গণনা করার জন্য একটি ভ্যারিয়েবল ব্যবহার করবেন এবং আপনি চান এটি সব ফাংশনে কাজ করুক।
এক্ষেত্রে আপনি একটি গ্লোবাল ভ্যারিয়েবল এবং ফাংশন ব্যবহার করতে পারেনঃ
kt_satt_skill_example_id=1216
এখানে একটি সমস্যা হচ্ছে, add() ফাংশনকে কল করা ছাড়াই যেকোনো স্ক্রিপ্ট পেজের counter পরিবর্তন করতে পারবে।
counter কে শুধুমাত্র add() পরিবর্তন করতে পারবে, এমন অবস্থা তৈরি করতে হবে।
যদি আমরা ফাংশনের ভিতরে counter ডিক্লেয়ার করি, তাহলে add() ফাংশন ছাড়া counter পরিবর্তন করা যাবে নাঃ
kt_satt_skill_example_id=1217
ইহা কার্যকর না! প্রতিবার যখন add() ফাংশন কল করা হয়, counter এর মান 1 থাকে।
সকল ফাংশন গ্লোবাল স্কোপকে এক্সেস করতে পারে।
জাভাস্ক্রিপ্টের সকল ফাংশন তাদের উপরের স্কোপকে এক্সেস করতে পারে।
জাভাস্ক্রিপ্ট নেস্টেড ফাংশন সাপোর্ট করে। নেস্টেড ফাংশন তাদের উপরের স্কোপকে এক্সেস করতে পারে।
নিচের উদাহরণে, plus() ফাংশনটি প্যারেন্ট ফাংশনের counter ভ্যারিয়েবলকে এক্সেস করতে পারবেঃ
kt_satt_skill_example_id=1220
এখনও সমাধান পাওয়া যায়নি। যদি আমরা বাইরে থেকে plus() ফাংশনকে এক্সেস করতে পারি তবে এই সমস্যার সমাধান পাওয়া যাবে।
counter = 0 এই স্টেটমেন্টটি শুধুমাত্র একবার এক্সিকিউট করার একটি উপায় বের করতে হবে।
kt_satt_skill_example_id=1222
এখানে add ভ্যারিয়েবলে সেলফ-ইনভোকিং ফাংশনের ভ্যালু রিটার্ন করা হয়েছে।
সেলফ-ইনভোকিং ফাংশনটি একবার রান হয়। ইহা counter এর ভ্যালু 0 সেট করে এবং একটি ফাংশন এক্সপ্রেশন রিটার্ন করে।
এই পদ্ধতিতে add একটি ফাংশনে পরিণত হয় এবং ইহা তার প্যারেন্ট স্কোপের counter এক্সেস করতে পারে।
একে জাভাস্ক্রিপ্ট ক্লোজার বলে। এর দ্বারা ফাংশনে প্রাইভেট ভ্যারিয়েবল তৈরি করা সম্ভব।
ক্লোজার হচ্ছে একটি ফাংশন যার প্যারেন্ট ফাংশন কাজ করা বন্ধ করে দিলেও এই ফাংশনটি প্যারেন্টের স্কোপকে এক্সেস করতে পারে।
আরও দেখুন...